gsk: Port GskGLRenderer to GLES
authorEmmanuele Bassi <ebassi@gnome.org>
Mon, 25 Apr 2016 11:26:46 +0000 (12:26 +0100)
committerEmmanuele Bassi <ebassi@gnome.org>
Tue, 18 Oct 2016 10:29:34 +0000 (11:29 +0100)
Use the appropriate API and shaders if the GdkGLContext was created for
OpenGL ES instead of OpenGL.

gsk/gskglrenderer.c
gsk/resources/glsl/gles-base.fs.glsl [new file with mode: 0644]
gsk/resources/glsl/gles-base.vs.glsl [new file with mode: 0644]

index 4a5a03fbeb0e2ffbe565aadeb09bd798eac5862c..53945ee7a46f1e6a5d984dae0600d4f4ba62c395 100644 (file)
@@ -160,7 +160,11 @@ gsk_gl_renderer_allocate_buffers (GskGLRenderer *self,
       glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
       glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
       glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-      glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
+
+      if (gdk_gl_context_get_use_es (self->context))
+        glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+      else
+        glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
     }
 
   if (self->render_buffer != 0)
@@ -302,8 +306,16 @@ gsk_gl_renderer_create_program (GskGLRenderer *self)
   GBytes *source;
   int status;
 
-  vs_path = "/org/gtk/libgsk/glsl/gl3-base.vs.glsl";
-  fs_path = "/org/gtk/libgsk/glsl/gl3-base.fs.glsl";
+  if (gdk_gl_context_get_use_es (self->context))
+    {
+      vs_path = "/org/gtk/libgsk/glsl/gles-base.vs.glsl";
+      fs_path = "/org/gtk/libgsk/glsl/gles-base.fs.glsl";
+    }
+  else
+    {
+      vs_path = "/org/gtk/libgsk/glsl/gl3-base.vs.glsl";
+      fs_path = "/org/gtk/libgsk/glsl/gl3-base.fs.glsl";
+    }
 
   GSK_NOTE (OPENGL, g_print ("Compiling vertex shader\n"));
   source = g_resources_lookup_data (vs_path, 0, NULL);
diff --git a/gsk/resources/glsl/gles-base.fs.glsl b/gsk/resources/glsl/gles-base.fs.glsl
new file mode 100644 (file)
index 0000000..ff43db9
--- /dev/null
@@ -0,0 +1,11 @@
+precision mediump float;
+
+uniform mat4 mvp;
+uniform sampler2D map;
+uniform float alpha;
+
+varying vec2 vUv;
+
+void main() {
+  gl_FragColor = texture2D(map, vUv) * vec4(alpha);
+}
diff --git a/gsk/resources/glsl/gles-base.vs.glsl b/gsk/resources/glsl/gles-base.vs.glsl
new file mode 100644 (file)
index 0000000..747e05e
--- /dev/null
@@ -0,0 +1,12 @@
+uniform mat4 mvp;
+
+attribute vec2 position;
+attribute vec2 uv;
+
+varying vec2 vUv;
+
+void main() {
+  gl_Position = mvp * vec4(position, 0.0, 1.0);
+
+  vUv = vec2(uv.x, 1.0 - uv.y);
+}